package com.huanlis.core;

import com.huanlis.core.util.ActionException;

/**
 * 工作流动作接口
 * 定义了工作流中动作的基本行为
 * 
 * @param <T> 输入参数类型，必须继承自BaseDomain
 * @param <R> 输出结果类型，必须继承自BaseDomain
 */
public interface Action<T extends BaseDomain, R extends BaseDomain> {

    /**
     * 执行动作
     * 
     * @param t 输入参数
     * @return 执行结果
     * @throws ActionException 动作执行异常
     */
    R execute(T t) throws ActionException;

    /**
     * 注册动作
     */
    void register(ActionRegistry actionRegistry);

    /**
     * 在执行动作前调用的处理方法
     *
     * @param input 输入参数
     */
    default void processBefore(T input) {}

    /**
     * 在执行动作后调用的处理方法
     *
     * @param output 执行结果
     */
    default void processAfter(R output) {}
}